package utilities;

import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.text.NumberFormat;

public class Arredondamento {

	public static void main(String[] args) {

		roundWith_MathDotRound();

		roundWith_BigDecimal();
		
		roundWith_NuberFormat();

	}

	

	private static void roundWith_MathDotRound() {
		// ARREDONDAMENTO UTILIZANDO O METODO Math.round

		// O metodo estatico - Math.round - arredonda para inteiros.
		double x = 34.9911;
		System.out.println(x);
		double result = Math.round(x);
		System.out.println(result);

		// Arredondando para duas casas depois da virgula:

		// multiplica-se o valor por 100 primeiro para andar dois decimais para o valor inteiro
		// ex 34.9911 * 100 = 3499.11, depois arredondamos - 3499.0 depois dividimos por 100 para retornar 
		// os valores para decimais.
		double x2 = 34.3411;
		double result2 = Math.round(x2 * 100) / 100.0;
		
		// IMPORTANTE! Nao utilizar o numero inteiro 100 pois no meio do calculo ocorre um (cast) para inteiro
		// e finalmente um cast para double, perdendo os valores fracionarios
	}

	

	private static void roundWith_BigDecimal() {
		
		// ARREDONDAMENTO UTILIZANDO A CLASSE BigDecimal
		
		//Primeiramente devemos criarum Objeto da classe MathContext que carrega as informacoes sobre o arredondamento
		// (numero de digitos toal do numero arredondado, um valor do ENUM RoundingMode)
		MathContext setMathContext = new MathContext(4, RoundingMode.HALF_UP);
		
		// converter numero a ser arredondado para o wrapper class BigDecimal. OBSERVACAO: melhor converter do string!
		//(pois do string para douboe nao ha perda de precisao)
		double d = 34.5755;
		BigDecimal numberToBeRounded = new BigDecimal(Double.toString(d));
		
		// O metodo round da classe BigDouble recebe como argumento um objeto MathContext
		BigDecimal roundedNumber = numberToBeRounded.round(setMathContext);

		// print do array de valores do ENUM RoundingMode
		for (RoundingMode c : RoundingMode.values())
			System.out.println(c);

		System.out.println(roundedNumber);
	}
	
	private static void roundWith_NuberFormat() {
		// TODO Auto-generated method stub
		
	}

}
